package Singleton;

import java.io.Serializable;

public class Singleton4 implements Serializable {
    private Singleton4(){
        if (INSTANCE!=null){  // if语句放止反射破坏单例模式
            throw new RuntimeException("单例对象不能重复创建");
        }
        System.out.println("所有单例模式中构造器都需要私有化4");
    }

    //volatile 保证线程共享变量可见性和有序性
    private static volatile Singleton4 INSTANCE = null;
    // 如果没有volatile 可能会发生如下情况             有volatile的情况
    // 线程1                线程2                     线程1
    // new Singleton4                                 new Singleton4
    // INSTANCE = 对象                                Singleton4()
    //                     if(INSTANCE==null)        INSTANCE = 对象
    //                     returen INSTANCE
    // Singleton4()

    //双重锁保证线程安全的同时，提高效率
    public static Singleton4 getInstance() {
        if (INSTANCE == null){
            synchronized (Singleton4.class){
                if (INSTANCE ==null){
                    INSTANCE = new Singleton4();  // 多线程下多个线程都会进入该语句
                }
            }
        }
        return INSTANCE;
    }

    public static void otherMethod(){
        System.out.println("Singleton4：otherMethod");
    }

    // 放止反序列化破坏单例模式
    public Object readResolve(){
        return INSTANCE;
    }


}
